package day0719API;

public class Test2 {
    public static void main(String[] args) {
        String name1="hello";
        String name2="hello";//字符串数据"hello"，叫做字符串字面量
        System.out.println(name1 == name2);//true :　
        // 同样的字符串字面量在内存中只有一份儿(所以name1和name2变量保存的地址是相同的)


        String s1=new String("hello");
        //1.上边name1和name2表示字符串的方式，只会在堆中创建字符数组(一个对象)
        //2.这里的s1表示字符串的方式，既会在堆中创建字符数组，还会在堆中new一个对象存储(两个对象)

        System.out.println(name1 ==  s1);//false
        //name1指向字符数组的地址，　　s1指向new String()对象的地址，地址不同，结果是false


        System.out.println(name1.equals(s1));



        String s2="张";
        String s2_2="张";
        s2=s2+3;
        System.out.println(s2);//"张"   "张３"
        //s2原本代表"张",  然后让s2代表"张３"

        System.out.println(s2_2  ==  s2);//false

        String s3="hello" + "world";
        //java编译器在编译时，能确定的字符串结果就在编译时直接计算了(存入到class中了)
        //(这样在jvm执行class文件时就不需要进行计算了)， 所以Test2.class文件保存的s3变量代码应该为
        //String s3="helloworld";



        String  s4="hello";
        String  s5=s4+"world";//不会触发编译期计算特性，虚拟机执行时产生新StringBilder对象


        String s6="helloworld";
        System.out.println(s5==s6);//????
        System.out.println(s3==s6);//地址相同


        String s7=1+"2"+3+"hello";
        String s8="123hello";
        System.out.println(s7  ==  s8);

        String s9=1+'2'+3+"hello";
        System.out.println(s9 == s8);

    }
}
